package ru.assa.signalka;


import java.util.HashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;


public class MainActivity extends Activity implements OnClickListener,ButtonCallbackListener,ServiceCallbackListener,Runnable  {
//объявление переменных	
	private AtomicInteger idCounter = new AtomicInteger(); //Вот такой вот специальный счетчик
	private String LOG_TAG = "MainActivity";
	boolean bound = false;
    private int requestId = -1;
    
    static boolean debug = true; 
	
    static TextView log_text_View; //ЛОГ
    
    static HashMap command_view = new HashMap<String, SyncToggleButton>();
    
    

	TextView t_text_textView; //Инфа о температуре в салоне
	TextView t_c_text_textView; //Температура компа
	SyncToggleButton c_off_toggleButton; //Включает выключает комп


	SyncToggleButton engage_button; //Зажигание
	SyncToggleButton rotate_key_button; //поворот ключа

	SyncToggleButton update_button;

    
	SyncToggleButton dor_button;

    
	   @Override
	   public void onCreate(Bundle savedInstanceState) {	 //предопределенный класс выполняется при открытии
	         super.onCreate(savedInstanceState);
	         setContentView(R.layout.main); //выбираем активити по умолчанию
	         //Подключаем интерфейсы
	         //страно но мне кажется это надо делать в конствукторе а не в методе
	         log_text_View = (TextView) findViewById(R.id.log_text_View);
	         log_text_View.setMovementMethod(new ScrollingMovementMethod());
	         
	         t_text_textView = (TextView) findViewById(R.id.t_text_textView);
	         
	         t_c_text_textView = (TextView) findViewById(R.id.t_c_text_textView);

	         
	         dor_button    = (SyncToggleButton) findViewById(R.id.dor_ToggleButton);
	         dor_button.setCommand("dor");
		         
	         c_off_toggleButton = (SyncToggleButton) findViewById(R.id.c_off_toggleButton);
	         c_off_toggleButton.setCommand("c_off");
	         
	         engage_button = (SyncToggleButton) findViewById(R.id.engage_button);
	         engage_button.setCommand("engage");

	         rotate_key_button = (SyncToggleButton) findViewById(R.id.rotate_key_button);
	         rotate_key_button.setCommand("key");
	         rotate_key_button.setDependView(engage_button);
	         
	         update_button = (SyncToggleButton) findViewById(R.id.update_Button);
	         update_button.setCommand("update");
	         update_button.setDependView(rotate_key_button, c_off_toggleButton, engage_button, dor_button);
//	         dor_button.setPressed(true);
	         Runnable r = new MainActivity(); //XXX Может стоит приостановить активити до запуска сервиса? это проще и надежней
	         Thread t = new Thread(r);
	         t.start();
     } //onCreate

	   
	    private int createId() {
	    	return idCounter.getAndIncrement();
	    }
	   
	   public static void sendToServise(Context context, int requestId , String command , String val){
		   //TODO сделать requestId
			Intent i = new Intent(context, BluetoothService.class);
			i.putExtra("command", command);
			i.putExtra("value", val);
			context.startService(i);
	        if (debug ) if (log_text_View != null) log_text_View.append( "<" + requestId + " "  + command + " " + val + "\n");
	   } //sendToServise
	   
	   public void toServise( String command, String val){
			MainActivity.sendToServise(this, createId(), command, val);
	   }//toServise
	   
	   public void toServise( String command, boolean val){
			if (val) {
				MainActivity.sendToServise(this, createId(), command, "1");
			}else{
				MainActivity.sendToServise(this, createId(), command, "0");
			}
	   }//toServise
	   
	    public void onServiceCallback(int requestId, String command, String val) {
	    	boolean value = false; 
	    	SyncToggleButton stb = (SyncToggleButton) command_view.get(command);
	    	
	    	if ( stb != null ){
		    if (val.equals("1")) {
		    	value=true;
		    }else if (val.equals("0")){
		    	value=false;
		    }else{
		    	if (log_text_View != null) log_text_View.append( "not found value for " + command + " " + "val" + "\n");
		    }
		    stb.setUpdate(value);
	    	}
		    if (debug ) log_text_View.append( ">" + requestId + " " + command + " " + val + "\n");
	    }//onServiceCallback
	   
	@Override
	protected void onDestroy(){	
	       super.onDestroy();
//	       if(btReceiver!= null){unregisterReceiver(btReceiver);}
	       stopService(new Intent(this,BluetoothService.class)); //Не нужно
	   } //onDestroy
	   
   
	@Override
	public void onClick(View v) {
		//Учитывая что ИД расписаны выше странный и идиотский метод определения нажатия по ИД
			if ( v instanceof SyncToggleButton ) {
		    	 SyncToggleButton stb = (SyncToggleButton) v;
		    	 	stb.onUpdated(); //Нажата и недоступна до прихода ответа
		    	 if ( stb.getValueGetted() ) {
		    		 toServise(stb.getCommand(), stb.isChecked());
		    	 }else{
		    		 toServise(stb.getCommand(), "?"); 
		    	 }
			}else {
			switch (v.getId()) {
		     case R.id.update_Button:
//		    	 MainActivity.sendToServise(this, createId(), "update", "?");
//		    	 s = s + "1";
//		    	 ss += "Логи"+ s + "\n";
//		    	 requestId = getServiceHelper().sendToService("update", "?");

//		    	 startService(intent);
//		    	 bindService(intent, btConn, BIND_AUTO_CREATE);
		       // кнопка ОК
		       break;
			}
			}
	}
	
	public void onButtonEnableCallback( SyncToggleButton v, String val) {
		// TODO Auto-generated method stub
		Log.d( LOG_TAG, "onButtonEnableCallback" + " command " + v.getCommand() );
	}


// создание меню
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method stub
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

// обработка нажатий
@Override
public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
	case R.id.settings:
		Log.d(LOG_TAG, "SETTINGS");
	    Intent intent = new Intent(this, SettingsActivity.class);
	    startActivity(intent);
		break;
	case R.id.debug:
		Log.d(LOG_TAG, "DEBUG");
		if ( debug ) {
		item.setIcon(R.drawable.btn_check_off);
		debug = false;
		} else {
		item.setIcon(R.drawable.btn_check_on);
		debug = true;
		}
		break;
		
	default:
		Log.d(LOG_TAG, "Menu not found");
		break;
	}

	return super.onOptionsItemSelected(item);
}

@Override
public void run() {
	// TODO Auto-generated method stub
	while ( BluetoothService.BS == null ) {
		try {
			TimeUnit.SECONDS.sleep(1);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	BluetoothService.BS.addListener(this);
}//Run




	

} //MainActivity
	 
	


